﻿using System;
using mshtml;
using System.Drawing;
namespace AutoIE
{
    interface IPage
    {
    #region 属性

        /// <summary>
        /// 网页标题
        /// </summary>
        string DocTitle { get; }
        IHTMLDocument Document { get; set; }
        IHTMLDocument2 Document2 { get; }
        IHTMLDocument3 Document3 { get; }
        /// <summary>
        /// 网页当前网址，可能与打开时的Url不同
        /// </summary>
        string DocUrl { get; }
        /// <summary>
        /// 打开时的网址，可能会改变，用DocUrl获取当前网址
        /// </summary>
        string Url { get; }
        /// <summary>
        /// 状态
        /// </summary>
        string State { get; }
        /// <summary>
        /// 是否已经改变
        /// </summary>
        bool IsChanged { get; }
    #endregion

    #region 方法
       /// <summary>
        /// 点击网页中的元素
        /// </summary>
        /// <param name="elemId">元素的ID或名称</param>
        /// <returns>能找到元素返回true，否则false</returns>
        bool Click(string elemId);
        /// <summary>
        /// 网页是否包含指定文本
        /// </summary>
        /// <param name="text">要检查的文本</param>
        /// <returns>包含文本返回true，否则false</returns>
        bool Contains(string text);
        /// <summary>
        /// 执行Javascript脚本
        /// </summary>
        /// <param name="js">Javascript脚本</param>
        /// <returns>成功返回true，否则false</returns>
        bool ExecuteScript(string js);
        /// <summary>
        /// 执行Javascript函数
        /// </summary>
        /// <param name="functionName">函数名</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>返回Javascript函数的执行结果</returns>
        object ExecuteFunction(string functionName, object[] parameters = null);
        /// <summary>
        /// 填充网页元素值
        /// </summary>
        /// <remarks>
        /// 对于checkbox/radio button，通过值进行匹配；
        /// checkbox为多选时，用分号(;)隔开多个值(checkbox的value)，用于过滤要点击的checkbox。
        /// 对于select，其值设置为文本或数值均可，但为了准确，建议设置为值(option的value)。
        /// </remarks>
        /// <param name="mapping">
        /// 数据映射，格式为：数值,元素名,数值,元素名...
        /// 当数值为多个值时（用于checkbox），用分号(;)隔开，选中填写对应值，如v1;v3;v5，取消值前加双减号(--)，如 --v2;--v4
        /// v1;--v2;v3;--v4;v5表示选中v1,v3,v5, 取消选中v2,v4，其他保持原有值
        /// </param>
        /// <returns>成功返回true，否则false，部分成功也返回false</returns>
        bool Fill(object[] mapping);
        /// <summary>
        /// 获取指定元素值
        /// </summary>
        /// <param name="elemId">元素id或name</param>
        /// <returns>元素的值,失败返回""</returns>
        string GetElemValue(string elemId);
        /// <summary>
        /// 获取指定元素的HTML代码
        /// </summary>
        /// <param name="elemId">元素id或name</param>
        /// <returns>元素的HTML代码,失败返回""</returns>
        string GetElemHtml(string elemId);
        /// <summary>
        /// 获取指定的图像
        /// </summary>
        /// <param name="imgSrcAlt">图像的网址或提示</param>
        /// <returns>成功返回图像对象，失败返回null</returns>
        Image GetImage(string imgSrcAlt);

        /// <summary>
        /// 获取文本
        /// </summary>
        /// <param name="elemId">元素id或name</param>
        /// <returns>元素的值,失败返回""</returns>
        string GetElemText(string elemId);
        /// <summary>
        /// 忽略Javascript函数
        /// </summary>
        /// <remarks>一般用于系统或网页中已有函数,如让confirm总是返回true</remarks>
        /// <param name="functionName">函数名字,如confirm</param>
        void IgnorFunction(string functionName);
        /// <summary>
        /// 注入新的Javascript函数
        /// </summary>
        /// <remarks>注入后可以用ExecuteFunction执行函数</remarks>
        /// <param name="functionName">函数名</param>
        /// <param name="functionCode">函数代码,形如function(){...}</param>
        void InjectFunction(string functionName, string functionCode);
        /// <summary>
        /// 设置新url并打开
        /// </summary>
        /// <remarks>当前网页转到指定网址，而不是IE窗口。这在包含iframe或frameset时会有区别。</remarks>
        /// <param name="url">网址</param>
        void Navigate(string url);
        /// <summary>
        /// 提交数据
        /// </summary>
        /// <param name="formName">表单名称或id</param>
        /// <returns>成功返回true，否则false</returns>
        bool Submit(string formName);
    #endregion
    }
}
